/*
 * Semaphores.cpp
 *
 *  Created on: Mar 24, 2011
 *      Author: stud
 */
#include "linuxwrap.h"
#include <semaphore.h>
#include <cassert>

//====================================================
//METHOD  : CountingSemaphore ctor
//DESCR.  :
//====================================================
CountingSemaphore::CountingSemaphore(unsigned init)
{
	//assert(init < SEM_VALUE_MAX); // WTF! SEM_VALUE_MAX is undefined... http://www.sbin.org/doc/glibc/libc_34.html
	if (sem_init(&id, NULL, init) == -1)
	{
		linuxwrap::reportError("CountingSemapore constructor");
		exit(1);
	}

}

//====================================================
//METHOD  : dtor
//DESCR.  :
//====================================================
CountingSemaphore::~CountingSemaphore()
{
	if (sem_destroy(&id) == -1)
		linuxwrap::reportError("CountingSemapore destructor");
}

//====================================================
//METHOD  : wait
//DESCR.  :
//====================================================
void CountingSemaphore::wait()
{
	if (sem_wait(&id) == -1)
		linuxwrap::reportError("CountingSemapore wait");
}

//====================================================
//METHOD  : signal
//DESCR.  :
//====================================================
void CountingSemaphore::signal()
{
	if (sem_post(&id) == -1)
		linuxwrap::reportError("CountingSemapore signal");
}

//====================================================
//METHOD  : Mutex ctor
//DESCR.  :
//====================================================
Mutex::Mutex()
{
	if ((errno = pthread_mutex_init(&id, NULL)) != 0)
	{
		linuxwrap::reportError("Mutex constructor");
		exit(1);
	}
}

//====================================================
//METHOD  : Mutex dtor
//DESCR.  :
//====================================================
Mutex::~Mutex()
{
	if ((errno = pthread_mutex_destroy(&id)) != 0)
		linuxwrap::reportError("Mutex destructor");
}

//====================================================
//METHOD  : signal
//DESCR.  :
//====================================================
void Mutex::signal()
{
	if ((errno = pthread_mutex_unlock(&id)) != 0)
		linuxwrap::reportError("Mutex signal");
}

//====================================================
//METHOD  : wait
//DESCR.  :
//====================================================
void Mutex::wait()
{
	if ((errno = pthread_mutex_lock(&id)) != 0)
		linuxwrap::reportError("Mutex wait");
}
